]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
Delay login animation until after wallpaper has loaded
authorMichael Catanzaro <mcatanzaro@gnome.org>
Tue, 21 Jul 2020 00:00:32 +0000 (19:00 -0500)
committerMichael Catanzaro <mcatanzaro@gnome.org>
Wed, 22 Jul 2020 01:25:31 +0000 (20:25 -0500)
Currently, the login animation can occur before the user's wallpaper has
been loaded. When this happens, we wind up displaying a solid blue
background for half a second or so before the proper background is
displayed. This looks jarring and bad. It's great that we can start
GNOME quickly, but starting up before the wallpaper is ready is *too*
quickly.

I've been meaning to fix this since 2014. Better late than never! We can
just have BackgroundManager emit a loaded signal the first time it loads
its first background, and have the startup animation code wait for that
before proceeding.

Some of this code is by Florian, who helped with promisifying. Thanks!

https://bugzilla.gnome.org/show_bug.cgi?id=734996

js/ui/background.js
js/ui/layout.js

index 20f5e89126ccda5b6d98b7a60cbcd1af957d1e08..2811da3fb06f09e61258dedf32106bc752adf44e 100644 (file)
@@ -765,10 +765,19 @@ var BackgroundManager = class BackgroundManager {
             this._updateBackgroundActor();
         });
 
+        let loadedSignalId = background.connect('loaded', () => {
+            background.disconnect(loadedSignalId);
+            loadedSignalId = null;
+            this.emit('loaded');
+        });
+
         backgroundActor.connect('destroy', () => {
             if (changeSignalId)
                 background.disconnect(changeSignalId);
 
+            if (loadedSignalId)
+                background.disconnect(loadedSignalId);
+
             if (backgroundActor.loadedSignalId)
                 background.disconnect(backgroundActor.loadedSignalId);
         });
index 55cefb2823f02396b79d1e1e7340be892ab2cabd..d37c769409c672f8574d2bfc4794d0bac00c6722 100644 (file)
@@ -457,6 +457,15 @@ var LayoutManager = GObject.registerClass({
         }
     }
 
+    _waitLoaded(bgManager) {
+        return new Promise(resolve => {
+            const id = bgManager.connect('loaded', () => {
+                bgManager.disconnect(id);
+                resolve();
+            });
+        });
+    }
+
     _updateBackgrounds() {
         for (let i = 0; i < this._bgManagers.length; i++)
             this._bgManagers[i].destroy();
@@ -464,7 +473,7 @@ var LayoutManager = GObject.registerClass({
         this._bgManagers = [];
 
         if (Main.sessionMode.isGreeter)
-            return;
+            return Promise.resolve();
 
         for (let i = 0; i < this.monitors.length; i++) {
             let bgManager = this._createBackgroundManager(i);
@@ -473,6 +482,8 @@ var LayoutManager = GObject.registerClass({
             if (i != this.primaryIndex && this._startingUp)
                 bgManager.backgroundActor.hide();
         }
+
+        return Promise.all(this._bgManagers.map(this._waitLoaded));
     }
 
     _updateKeyboardBox() {
@@ -631,7 +642,7 @@ var LayoutManager = GObject.registerClass({
     // When starting a normal user session, we want to grow it out of the middle
     // of the screen.
 
-    _prepareStartupAnimation() {
+    async _prepareStartupAnimation() {
         // During the initial transition, add a simple actor to block all events,
         // so they don't get delivered to X11 windows that have been transformed.
         this._coverPane = new Clutter.Actor({ opacity: 0,
@@ -648,8 +659,6 @@ var LayoutManager = GObject.registerClass({
         } else if (Main.sessionMode.isGreeter) {
             this.panelBox.translation_y = -this.panelBox.height;
         } else {
-            this._updateBackgrounds();
-
             // We need to force an update of the regions now before we scale
             // the UI group to get the correct allocation for the struts.
             this._updateRegions();
@@ -665,6 +674,8 @@ var LayoutManager = GObject.registerClass({
             this.uiGroup.scale_x = this.uiGroup.scale_y = 0.75;
             this.uiGroup.opacity = 0;
             global.window_group.set_clip(monitor.x, monitor.y, monitor.width, monitor.height);
+
+            await this._updateBackgrounds();
         }
 
         this.emit('startup-prepared');